package com.practice.ex;

import com.practice.web.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.DisabledException;
import org.springframework.security.authentication.InternalAuthenticationServiceException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Set;

/**
 * 全局异常处理器
 *
 * @author java@tedu.cn
 * @version 0.0.1
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler
    public JsonResult<Void> handleServiceException(ServiceException e) {
        log.warn("程序运行过程中出现ServiceException，将统一处理！");
        log.warn("异常信息：{}", e.getMessage());
        return new JsonResult<>(e.getErrorCode().getCode(),e.getMessage());
    }
    
    @ExceptionHandler
    public JsonResult<Void> handleThrowable(Throwable e) {
            log.warn("程序运行过程中出现Throwable，将统一处理！");
            log.warn("异常类型：{}", e.getClass());
            log.warn("异常信息：{}", e.getMessage());
            String message = "【开发阶段专用】服务器端出了异常，请检查服务器端控制台中的异常信息，并补充处理此类异常的方法！";
            // String message = "服务器忙，请稍后再尝试！"; // 项目上线时应该使用此提示文本
            e.printStackTrace(); // 打印异常的跟踪信息，主要是为了在开发阶段更好的检查出现异常的原因
            return new JsonResult<>(ServiceErrorCode.ERR_NOT_FOUND.getCode(), e.getMessage());
    }
    
    
    @ExceptionHandler
    public JsonResult<Void> handleConstraintViolationException(MethodArgumentNotValidException e) {
        log.warn("程序运行过程中出现handleConstraintViolationException，将统一处理！");
        log.warn("异常信息：{}", e.getMessage());
        return new JsonResult<>(ServiceErrorCode.ERR_BAD_REQUEST.getCode(), e.getMessage());
    }
    
    @ExceptionHandler({InternalAuthenticationServiceException.class,
            BadCredentialsException.class})
    public JsonResult<Void> handleAuthenticationException(AuthenticationException e) {
        log.warn("程序运行过程中出现AuthenticationException，将统一处理！");
        log.warn("异常信息：{}", e.getMessage());
        String message = "登录失败，用户名或密码错误！";
        return new JsonResult(ServiceErrorCode.ERR_BAD_REQUEST.getCode(), message);
    }

    @ExceptionHandler
    public JsonResult<Void> handleDisabledException(DisabledException e) {
        log.warn("程序运行过程中出现DisabledException，将统一处理！");
        log.warn("异常信息：{}", e.getMessage());
        String message = "登录失败，此账号已经被禁用！";
        return new JsonResult(ServiceErrorCode.ERR_BAD_REQUEST.getCode(), message);
    }
//
//    @ExceptionHandler
//    public JsonResult<Void> handleAccessDeniedException(AccessDeniedException e) {
//        log.warn("程序运行过程中出现AccessDeniedException，将统一处理！");
//        log.warn("异常信息：{}", e.getMessage());
//        String message = "禁止访问，您当前登录的账号无此操作权限！";
//        return JsonResult.fail(ServiceCode.ERR_FORBIDDEN, message);
//    }
//

}